#include "Cuba.h"
#include "Registro.h"
#include "ClaveDatoCuba.h"
#include "DatoCuba.h"

namespace Toolkit
{

Cuba::Cuba(const unsigned long int &tamanoBloque, const TipoSerializacion& tipoSerializacion)
		  : Bloque (tamanoBloque, tipoSerializacion, false)
{
	this->profundidad = 0;
}

/* TODO: Confiamos en el constructor copia por defecto. Implementarlo aca implicaria modificaciones a las clases padre.
Cuba::Cuba(const Cuba &cubaOriginal)
{
	espacioOcupado = cubaOriginal.espacioOcupado;
	componentes = cubaOriginal.componentes;
} */


Cuba::~Cuba()
{
}

unsigned int Cuba::getProfundidad() const
{
	return this->profundidad;
}

void Cuba::incrementarProfundidad()
{
	profundidad++;
}

void Cuba::decrementarProfundidad()
{
	profundidad--;
}

void Cuba::serializar(stringstream&) const
{
}

void Cuba::hidratar(const stringstream&)
{
}

Componente* Cuba::nuevaInstancia() const
{
	return NULL;
}

bool Cuba::combinar(Cuba &cuba)
{
	if (this->getTamanoBloque() >= cuba.espacioLibre() + this->espacioLibre())
	{
		return false;
	}

	for (int i = 0; i < cuba.cantElementos(); i++)
	{
		Registro *aux = (Registro*)cuba.pop();
		DatoCuba *datoCuba = (DatoCuba*)aux->getDato();
		ClaveDatoCuba claveDatoCuba(datoCuba->getClaveDelDato());
		cuba.agregar(*aux, claveDatoCuba);
		delete aux;
	}

	this->decrementarProfundidad();

	return true;
}

}
